/*
 * Balon.java
 *
 * Created on 31 de marzo de 2007, 19:27
 *
 */

package futbol.tacticas.concursantes2007.tikitaka.tactica;

import java.awt.Point;
import futbol.General;

/**
 *
 * @author Ismael Mariscal Mena
 */
public class Balon {
    
    private Point posicionAnterior;
    private Point posicionActual;
    private Point posicionFutura;
    private Point posicionInicial;
    private int velocidadInicial;
    private int distancia;
    private int velocidad;  //Velocidad que la baln lleva actualmente
//    private int v[];
//    private int cont;
    private double angulo;     //Angulo del baln
    private double coseno;     //Coseno de angulo
    private double seno;       //Seno de angulo
        
    /** Creates a new instance of Balon */
    public Balon() {
        ponerEnElCentro();
//        v = new int[3];
    }
    
    public int esGol()
    {
        double angulo, y = 0.0;
        if (posicionActual.x <= -160)
        {
            angulo = General.getAngulo(posicionAnterior.x, posicionAnterior.y, posicionActual.x, posicionActual.y);
            y = posicionAnterior.y + Math.sin(angulo) * (160 + posicionAnterior.x);
            if (y > -30.0 && y < 30.0) return 1;
        }
        else if (posicionActual.x >= 160)
        {
            angulo = General.getAngulo(posicionAnterior.x, posicionAnterior.y, posicionActual.x, posicionActual.y);
            y = posicionAnterior.y + Math.sin(angulo) * (160 - posicionAnterior.x);
            if (y > -30.0 && y < 30.0) return 0;
        } 
        if (posicionAnterior.x <= -160 && posicionActual.x == 0)
            return 3;
        else if (posicionAnterior.x >= 160 && posicionActual.x == 0)
            return 2;
    
        return -1;
    }
    
    public void ponerEnElCentro()
    {
        posicionAnterior = new Point(0, 0);
        posicionActual = new Point(0, 0);
        posicionInicial = new Point(0, 0);
        velocidadInicial = 0;
        distancia = 0;
        velocidad = 0;
        angulo = 0;
        coseno = 0;
        seno = 0;
//        cont = 0;
    }
    
    public double getVelocidad()
    {
        return velocidad;
    }

    public double getAngulo()
    {
        return angulo;
    }
    
    public Point getPosicionActual()
    {
        return posicionActual;
    }

    public void setPosicionActual(Point posicion)
    {
        Point p = getPosicion(1);
//        System.out.print("\n        Posicion Bola: " + posicion + " Posicion Predicha: " + p);
        posicionAnterior = posicionActual;
        posicionActual = posicion;
        
        if (Util.distancia_2(p, posicion) > 8)
        {
//            cont = 0;
            velocidad = ((int)Math.round(General.getDistancia(posicionActual.x, posicionActual.y, posicionAnterior.x, posicionAnterior.y)/3))*3 - 1;
            velocidadInicial = velocidad + 1;
            distancia = velocidad + 1;
            posicionInicial = posicionAnterior;
        }
        else
        {
            this.velocidad--;
        }
        this.angulo = General.getAngulo(posicionInicial.x, posicionInicial.y, posicionActual.x, posicionActual.y);
        coseno = Math.cos(angulo);
        seno = Math.sin(angulo);

        if (this.velocidad < 0) this.velocidad = 0;
//        System.out.println("Distancia: " + Util.distancia_2(p, posicion) + "Velocidad Calculada:       " + this.velocidad);
        
    }

    public void setPosicionFutura(Point posicion)
    {
        posicionFutura = posicion;
    }
    
    public Point getPosicion(int tiempo)
    {   //Falta calcula si el balon rebota en la pared.
        double x = posicionActual.x, y = posicionActual.y;
//        double x = posicionInicial.x, y = posicionInicial.y;
        int velocidadAux = (int)velocidad;
//        int velocidadAux = (int)velocidadInicial;
//        tiempo += (velocidadInicial - velocidad);
        if (velocidadAux > 21) velocidadAux = 21;
        
        while (tiempo > 0 && velocidadAux > 0)
        {
            x += Math.cos(angulo) * velocidadAux;
            y += Math.sin(angulo) * velocidadAux;
            velocidadAux--;
            tiempo--;
        }
        if (x > 160)
            x = 320 - x;
        if (x < -160)
            x = -320-x;
        if (y > 120)
            y = 240 - y; //120 - (x-120)
        if (y < -120)
            y = -240 - y;  //-120 + (-120-x)
        
        return new Point((int)Math.round(x), (int)Math.round(y));
    }
}
